﻿/**********************************************************************
* @file   FITKAcousticsSEAFaceMgrAdaptor.h
* @brief  Face管理器数据读写适配器
* @author yangjing (1195810980@qq.com)
* @date   2025-02-25
*********************************************************************/
#ifndef _FITFK_ACOUSTICS_SEA_FACE_MGR_MODEL_ADAPTOR_H___
#define _FITFK_ACOUSTICS_SEA_FACE_MGR_MODEL_ADAPTOR_H___

#include "FITKAcousticsAbstractAdaptor.h"
#include "FITK_Kernel/FITKCore/FITKCoreMacros.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITK_Component/FITKAcousticsModel/FITKAbstractSEASubSysWithNodes.h"
#include <H5Cpp.h>

namespace IO {
    class FITKHDF5FileTool;
}

namespace Acoustics{
    class FITKSEAFaceManager;
    class FITKAcousticsTriangles;
    class FITKAbstractSEASubSysWithNodes;
}

namespace IO
{
    class FITKAcousticsHDF5IOAPI FITKAcousticsSEAFaceMgrAdaptor : public FITKAcousticsAbsAdaptor
    {
    public:
        explicit FITKAcousticsSEAFaceMgrAdaptor() = default;
        virtual ~FITKAcousticsSEAFaceMgrAdaptor() = default;

        virtual bool adaptR() override;

        virtual bool adaptW() override;

    private:

        /**
        * @brief 根据类型创建不同子类,并给特定子类设置特定数据
        * @param @param[i]  faceType 面类型
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-10
        */
        Acoustics::FITKAbstractSEAFace * fromTypeCreateClass(H5::Group &gp, Acoustics::FITKAbstractSEASubSys::SEASubSysType faceType);


        /**
        * @brief 读hdf5数据到面管理器
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  mager    面管理器
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool readFace(H5::Group & gp, Acoustics::FITKSEAFaceManager * mager);

        /**
        * @brief 写面管理器中数据到hdf5
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  FaceManagerP    面管理器
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool writeFace(H5::Group &gp, Acoustics::FITKSEAFaceManager* FaceManagerP);

        /**
        * @brief 写一个FITKAbstractSEAFace面中的子系统节点列表
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  Nodes    子系统节点列表
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool writeNodes(H5::Group& gp, QList<Acoustics::FITKAbstractSEASubSysWithNodes::SubSysNode> &Nodes);



        /**
        * @brief 读一个FITKAbstractSEAFace面中的子系统节点列表
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  faceP 需要填充的面
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool readNodes(H5::Group& gp, Acoustics::FITKAbstractSEAFace *faceP);

        /**
        * @brief 写一个FITKAbstractSEAFace面中的三角形列表
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  TriangleMesh    三角形列表数据
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool writeTriangleMesh(H5::Group& gp, Acoustics::FITKAcousticsTriangles*TriangleMesh);


        /**
        * @brief 读三角形列表写入面中
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  faceP    一个面的指针
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool readTriangleMesh(H5::Group &gp, Acoustics::FITKAbstractSEAFace *faceP);

        /**
        * @brief 写FITKAbstractSEAFace对象的子类的特有数据以及类型
        * @param @param[i]  gp hdf5组别
        * @param @param[i]  faceP    板基础对象
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        bool writeTypeFace(H5::Group& gp, Acoustics::FITKAbstractSEAFace *faceP);


        /**
        * @brief 读存储的面类型
        * @param @param[i]  gp hdf5组别
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        Acoustics::FITKAbstractSEASubSys::SEASubSysType readTypeFace(H5::Group &gp);

    private:

        /**
        * @brief 将SubSysNodeType枚举转换为int
        * @param @param[i]  Nodetype SubSysNodeType枚举
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        int SubSysNodeTypeToInt(Acoustics::FITKAbstractSEASubSysWithNodes::SubSysNodeType Nodetype);

        /**
        * @brief 将int转换为SubSysNodeType枚举
        * @param @param[i]  Nodetype 枚举字符串
        * @author yangjing (1195810980@qq.com)
        * @date 2024-1-9
        */
        Acoustics::FITKAbstractSEASubSysWithNodes::SubSysNodeType IntFromSubSysNodeType(int Nodetype);


    private:
        std::vector<std::vector<int>>m_TriangleAllElementData;//[0]为ID  [1][2][3]节点  复用容器
        bool m_isinit = false;//判断m_TriangleAllElementData是否已经分配内存了
        IO::FITKHDF5FileTool*m_toolp{ nullptr };
    };
    Register2FITKIOAdaptorFactory(FITKAcousticsHDF5, Acoustics::FITKSEAFaceManager, FITKAcousticsSEAFaceMgrAdaptor);
}
#endif
